package helper;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;

import model.Cliente;
import model.Pedido;
import model.Produto;



/**
 * Classe que contém métodos para gerar e ler arquivos serializados, que armazenam os nossos conjuntos,
 * tanto de clientes, como de produtos e pedidos.
 * Cada conjunto tera um arquivo separado.
 * OBS: Os metodos de serializacao sempre geram um novo arquivo. Entao, antes de 
 * serializar, ter certeza que todos os elementos necessarios já estão no Hash,
 * senão pode ocorrer uma perda de dados.
 * 
 * @author Jamison
 */
public class FilesHelper {
	
	/**
	 * Esse metodo serializa um HashMap<String, Cliente> e o salva em clientes.ser
	 * 
	 * 
	 * @param clientes O HashMap que sera serializado
	 * @throws IOException
	 */
	public static void serializaClientes(HashMap<String, Cliente> clientes) throws IOException{
		FileOutputStream out = new FileOutputStream(new File("clientes.ser"));
		ObjectOutputStream obj = new ObjectOutputStream(out);
		obj.writeObject(clientes);
		obj.close();
	}
	
	/**
	 * Esse metodo le o unico HashMap de clientes.ser, retorna o objeto que estava salvo
	 * 
	 * 
	 * @throws IOException
	 * @return O HashMap lido pelo metodo
	 */
	public static HashMap<String, Cliente> leClientesSerializados() throws IOException, ClassNotFoundException{
		FileInputStream in = new FileInputStream("clientes.ser");
		ObjectInputStream obj = new ObjectInputStream(in);
		@SuppressWarnings("unchecked")
		HashMap<String, Cliente> serializado = (HashMap<String, Cliente>) obj.readObject();
		obj.close();
		return serializado;
	}
	
	/**
	 * Esse método serializa o HashMap<String, Produto> e o salva em produtos.ser
	 * 
	 * 
	 * @param produtos O HashMap que sera serializado
	 * @throws IOException
	 */
	public static void serializaProdutos(HashMap<Integer, Produto> produtos) throws IOException{
		FileOutputStream out = new FileOutputStream(new File("produtos.ser"));
		ObjectOutputStream obj = new ObjectOutputStream(out);
		obj.writeObject(produtos);
		obj.close();
	}
	
	/**
	 * Esse metodo le o HashMap de produtos.ser, retorna o objeto que estava salvo
	 * 
	 * 
	 * @throws IOException
	 * @return O HashMap lido pelo método
	 */
	public static HashMap<Integer, Produto> leProdutosSerializados() throws IOException, ClassNotFoundException{
		FileInputStream in = new FileInputStream("produtos.ser");
		ObjectInputStream obj = new ObjectInputStream(in);
		@SuppressWarnings("unchecked")
		HashMap<Integer, Produto> serializado = (HashMap<Integer, Produto>) obj.readObject();
		obj.close();
		return serializado;
	}
	
	/**
	 * Esse metodo serializa o HashMap<String, Pedido> e o salva em pedidos.ser
	 * 
	 * 
	 * @param pedidos O HashMap que sera serializado
	 * @throws IOException
	 */
	public static void serializaPedido(HashMap<String, Pedido> pedidos) throws IOException{
		FileOutputStream out = new FileOutputStream(new File("pedidos.ser"));
		ObjectOutputStream obj = new ObjectOutputStream(out);
		obj.writeObject(pedidos);
		obj.close();
	}
	
	/**
	 * Esse metodo le o HashMap de pedidos.ser, retorna o objeto que estava salvo
	 * 
	 * 
	 * @throws IOException
	 * @return O HashMap lido pelo metodo
	 */
	public static HashMap<String, Pedido> lePedidosSerializados() throws IOException, ClassNotFoundException{
		FileInputStream in = new FileInputStream("pedidos.ser");
		ObjectInputStream obj = new ObjectInputStream(in);
		@SuppressWarnings("unchecked")
		HashMap<String, Pedido> serializado = (HashMap<String, Pedido>) obj.readObject();
		obj.close();
		return serializado;
	}
}